//************************************************************************
// author	:	vera												
// date		:	2011/4/3 1:28 					                 
//************************************************************************
#ifndef SL_NODE_H_
#define SL_NODE_H_
#include "Object.h"
#include "DrawAtrributeSet.h"
namespace sl
{
	class GroupNode;
	class NodeVisitor;
	
	typedef std::vector< sl::GroupNode * >		ParentList;
	class SL_EXPORT Node : public Object
	{
		public:
			Node();
			~Node();

			void	SetParent( sl::GroupNode * pParent );
			void	RemoveFromParent( sl::GroupNode * pParent );

			sl::DrawAttributeSet * GetOrCreateAttributes()
			{
				if ( !m_rDrawAttributeSet ) 
					m_rDrawAttributeSet = new DrawAttributeSet();
				return m_rDrawAttributeSet.get();	
			}

			sl::DrawAttributeSet * GetAtrributeSet()
			{
				return m_rDrawAttributeSet.get();
			}

			virtual void Accept( sl::NodeVisitor * pNodeVisitor ) {};
			virtual void Ascend( sl::NodeVisitor * pNodeVisitor ) {};
			virtual void Traverse( sl::NodeVisitor * pNodeVisitor ) {};

			virtual const std::string libraryname() { return "sl"; }
			virtual const std::string classname() { return "Node"; }

		protected:

			ParentList	m_vParents;

			sl::ref_ptr<sl::DrawAttributeSet>		m_rDrawAttributeSet;
	};
}

#endif